"""
函数参数进阶

1 可变和不可变参数

    a 在函数内部，针对参数使用赋值语句，不会影响调用函数时传递的实参变量
        无论传递的参数是可变还是不可变，只要针对参数使用赋值语句，会在函数内部修改局部变量的引用，不会影响到外部变量的引用
    b 如果传递的参数是可变类型，在函数内部，使用方法修改了数据的内容，同样会影响到外部的数据
        例如 在函数内部，使用 list.extend() 函数改变传递过来的参数的数据，函数外部的变量也会发生变化

扩展知识：在 Python 中，列表之间使用 += 运算符相当于调用列表的 extend() 方法，不会修改变量的引用

2 函数的缺省参数

    - 定义函数时，可以给某一个参数指定默认值，具有默认值的参数就叫做缺省参数
    - 调用函数时，如果没有传入缺省参数的值，则在函数内部使用定义函数时指定的参数默认值
    - 函数的缺省参数，将常见值设置为参数的缺省值，从而简化函数的调用

    定义函数时，指定函数的缺省参数：
        在参数后使用赋值语句，可以指定参数的缺省值
    提示：
        * 缺省参数，需要使用最常见的值作为默认值
        * 如果一个参数的值不能确定，则不应该设置默认值，具体的数值在调用函数时，由外界传递

    缺省参数的注意事项：
        a 缺省参数的定义位置
            * 必须保证带有默认值的缺省参数在参数列表末尾
        b 调用带有多个缺省参数的函数，需要指定参数名，这样解释器才能知道参数的对应关系

3 多值参数 (了解)

    定义支持多值参数的函数
        - 有时有可能需要一个函数能够处理的参数个数是不确定的，这个时候，就可以使用多值参数
        - python 中有两种多值参数
            i 参数名前增加一个 * 可以接收元组
            ii 参数名前增加两个 ** 可以接收字典
        - 一般在给多值参数命名时，习惯使用一下两个名字
            *args -- 存放元组的参数，前面有一个 *
                args 是 arguments 的缩写，有变量的含义
            **kwargs -- 存放字典的参数，前面有两个 **
                kw 是 keyword 的缩写，kwargs 可以记忆键值对参数
    
    * 多值参数一般会出现在开源的框架中，了解多值参数有助于读懂优秀开源框架的源码

"""


def demo(num_list):
    print("函数内部的代码")
    # 使用方法修改列表的内容
    num_list.append(9)
    print(num_list)
    print("函数执行完成")


def sum_numbers(*args):
    """计算所有传入参数的和"""
    sum = 0
    print(args)
    # 循环累加求和计算
    for num in args:
        sum += num
    return sum


gl_list = [1, 2, 3]
# 调用函数
demo(gl_list)
print("函数执行之后，列表的值")
print(gl_list)
